.MODEL small
.STACK 200h
.DATA
	_error_overflow_double   DB   'Runtime Error : double Overflow$'
	_error_underflow_double  DB   'Runtime Error : double Underflow$'
	_error_overflow_int      DB   'Runtime Error : integer Overflow$'
	_error_underflow_int     DB   'Runtime Error : integer Underflow$'
	_error_div_by_zero       DB   'Runtime Error : Division by ZERO!!!$'
	_warninig_double         DB   'Runtime warning : double Value Trimmed$'
	maxdouble                DQ   1.7976931348623157e308
	mindouble                DQ   2.2250738585072014e-308
	maxint                   DW   32767
	minint                   DW  -32768
	FlagVar                  DW   ?
	varauxDouble             DQ   ?
	varauxInt                DW   ?
	_CTE_3_0 DQ 3.0
	_STR_3070 DB 'b $'
	_CTE_5_0 DQ 5.0
	_c DQ ?
	_b DQ ?
	_CTE_10_0 DQ 10.0
	_a DQ ?
	_CTE_0_0 DQ 0.0
	_STR_3039 DB 'a $'
	_CTE_1_0 DQ 1.0

.CODE

.386

	;PROCEDIMIENTO OVERFLOW DOUBLE
	doubleoverflow proc 
		jo error_doubleoverflow 
		ret 
	doubleoverflow endp 


	;PROCEDIMIENTO UNDERFLOW DOUBLE
	doubleunderflow proc 
		jo error_doubleunderflow 
		ret 
	doubleunderflow endp 


	;PROCEDIMIENTO OVERFLOW INT
	intoverflow proc 
		jo error_intoverflow 
		ret 
	intoverflow endp 


	;PROCEDIMIENTO UNDERFLOW INT
	intunderflow proc 
		jo error_intunderflow 
		ret 
	intunderflow endp 


	;PROCEDIMIENTO DIVISION POR CERO
	zerodiv proc 
		jz error_zerodiv 
		ret
	zerodiv endp


	;PROCEDIMIENTO PRINT
	print proc
		mov ah,09h
		int 21h
		ret
	print endp 


	warning_asig proc 
		mov dx,offset _warninig_double
		call print 
		ret
	warning_asig endp


	error_doubleoverflow:
		mov dx,offset _error_overflow_double 
		call print
		mov al,1h 
		jmp SYSCALL_END

	error_doubleunderflow:
		mov dx,offset _error_underflow_double 
		call print
		mov al,2h 
		jmp SYSCALL_END

	error_intoverflow:
		mov dx,offset _error_overflow_int 
		call print
		mov al,3h 
		jmp SYSCALL_END

	error_intunderflow:
		mov dx,offset _error_underflow_int 
		call print
		mov al,4h 
		jmp SYSCALL_END

	error_zerodiv:
		mov dx,offset _error_div_by_zero 
		call print
		mov al,5h 
		jmp SYSCALL_END

	START:
		mov ax,@data 
		mov ds,AX 
		finit
		fclex

	;--------------Comienzo de tercetos--------------


	;IL(0)=(ASSIGN,_a,_CTE_0_0)
	; Comienzo de Asignacion
		fld _CTE_0_0
		fstp _a
	; Fin de Asignacion


	;IL(1)=(ASSIGN,_b,_CTE_3_0)
	; Comienzo de Asignacion
		fld _CTE_3_0
		fstp _b
	; Fin de Asignacion


	;IL(2)=(ASSIGN,_c,_CTE_5_0)
	; Comienzo de Asignacion
		fld _CTE_5_0
		fstp _c
	; Fin de Asignacion

L_3: 
	;IL(3)=(ADD,_a,_CTE_1_0)
	; Comienzo de Suma
		fld _a
		fld _CTE_1_0
		fadd
		fstsw FlagVar
		mov ax, FlagVar
		sahf 
		call doubleunderflow
	; Fin de Suma


	;IL(4)=(ASSIGN,_a,IL(3))
	; Comienzo de Asignacion
		fstp _a
	; Fin de Asignacion


	;IL(5)=(CAST_TOINT,_a)
	; Comienzo de conversion a Int
		fld _a
		fistp varauxInt
		mov BX , varauxInt
	; Fin de conversion a Int


	;IL(6)=(DIV,IL(5),2)
	; Comienzo de Division
		 mov DX , 0
		 mov AX , BX
		 mov CX , 2
		 cmp CX,0
		 call zerodiv
		 idiv CX
		 mov CX , AX 
	; Fin de Division


	;IL(7)=(CAST_TOINT,_a)
	; Comienzo de conversion a Int
		fld _a
		fistp varauxInt
		mov BX , varauxInt
	; Fin de conversion a Int


	;IL(8)=(ADD,IL(7),1)
	; Comienzo de Suma
		add BX , 1
		call intoverflow
	; Fin de Suma


	;IL(9)=(DIV,IL(8),2)
	; Comienzo de Division
		 mov DX , 0
		 mov AX , BX
		 mov BX , 2
		 cmp BX,0
		 call zerodiv
		 idiv BX
		 mov BX , AX 
	; Fin de Division


	;IL(10)=(EQ,IL(6),IL(9))
	; Comienzo de comparacion
		cmp CX , BX
	; Fin de comparacion


	;IL(11)=(BF,IL(14),IL(10))
	; Comienzo de Branch por falso
	jne L_14
	; Fin de branch por falso


	;IL(12)=(PRINT,_STR_3039)
	; Comienzo de impresion
		MOV DX, offset  _STR_3039
		call print
	; Fin de impresion


	;IL(13)=(BR,IL(15))
	; Comienzo de Branch incondicional
	jmp L_15
	; Fin de branch incondicional

L_14: 
	;IL(14)=(PRINT,_STR_3070)
	; Comienzo de impresion
		MOV DX, offset  _STR_3070
		call print
	; Fin de impresion

L_15: 
	;IL(15)=(EQ,_a,_CTE_10_0)
	; Comienzo de comparacion
		fld _a
		fld _CTE_10_0
		fcompp
		fstsw FlagVar
		mov ax, FlagVar
		sahf 
	; Fin de comparacion


	;IL(16)=(BF,IL(3),IL(15))
	; Comienzo de Branch por falso
	jne L_3
	; Fin de branch por falso


	;IL(17)=(END_PROG)
	; Comienzo del Fin de Programa
	NORMAL_END :
		mov al, 00h
	SYSCALL_END:
		mov ah, 4Ch
		int 21h
	END START
	; Fin de Fin de Programa

	;--------------Fin de tercetos--------------
